package com.huluobo.a2301mdmdemo.demo

import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.Log
import android.view.View
import android.view.animation.LinearInterpolator
import kotlinx.coroutines.runBlocking

/**
 *  Created by LC on 2025/7/4.
 *  1.在kotlin中类上的括号代表构造方法,继承的是父类的构造方法,本类声明的参数可以直接传递给父类
 *  2. 一个自定义View的构造方法有4种不同参数的形式
 *      1个参数是在代码中创建一个Vew的时候,比如礼物的ImageView
 *      2个参数一般用于xml上,attributeSet就是它的属性集合,一般默认就是宽高
 *      3个参数和4个参数的也是用于xml上的,一般不常用,其中包含的是Style文家和资源,应用主题的时候使用,比如夜间模式或者白天模式
 */
class MyView(context: Context) : View(context) {
    //    constructor(context: Context) : super(context)

    //测量 MatchParent,WarpContent,20dp
    //widthMeasureSpec 包含了2个值,一个是mode,一个size mode中分别有实际的值,和最大值(AtMost)2种形式
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }

    //摆放一个View的位置,一般单独的View不会使用这个方法,只在ViewGroup中才会使用
    // l t r b 分别代表距离左侧顶点的距离
    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
    }

    //画笔
    private lateinit var paint: Paint
    private lateinit var paintText: Paint

    //绘制的角度
    private var progress = 0f

    private var num = 5

    //初始化方法,一般调用在构造方法之后,创建对象的时候会调用
    init {
        initPaint()
        start()
    }

    private fun initPaint() {
        paint = Paint()
        paintText = Paint()
        //注意,导入的是android包下的Color,不要使用compose下的color,不是一个东西
        paint.color = Color.RED
        paintText.color = Color.RED
        paintText.textSize = 100f
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 5f
    }

    //绘制 Canvas 画布 Paint 画笔 比如View是一个圆,或者一段文字
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        //绘制一个文字
//        canvas.drawText("123", 100f, 100f, paint)
        //绘制一个矩形
//        canvas.drawRect(100f, 100f, 600f, 600f, paint)
        val rectF = RectF(100f, 100f, 600f, 600f)
        //绘制一个圆
        canvas.drawArc(rectF, 270f, progress, false, paint)
        canvas.drawText(num.toString(), 320f, 375f, paintText)
    }

    fun start() {
        //协程的newThread
        runBlocking {
            val animator = ValueAnimator.ofFloat(0f, 360f)
            animator.addUpdateListener {
                progress = it.animatedValue as Float
                Log.e("TagA", "progress:$progress")
                //刷新View自身的方法
                invalidate()
            }
            animator.interpolator = LinearInterpolator()
            animator.duration = 5000
            animator.start()

            val animatorText = ValueAnimator.ofInt(num, 0)
            animatorText.addUpdateListener {
                num = it.animatedValue as Int
                invalidate()
            }
            animatorText.interpolator = LinearInterpolator()
            animatorText.duration = 5000
            animatorText.start()
        }
    }
}